{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Action1：使用Pytorch编写神经网络，完成boston房价预测问题\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_boston\n",
    "# 数据加载\n",
    "data = load_boston()\n",
    "x = data['data']\n",
    "y = data['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(506, 13)"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(506,)"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 重新整理y形状，这里y本身就是1列的，不需要reshape了\n",
    "# y.reshape(-1,1)\n",
    "# y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据规范化\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "scaler = MinMaxScaler()\n",
    "x = scaler.fit_transform(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'torch.FloatTensor'"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "# 数据转换ndarray-->Tensor\n",
    "x = torch.from_numpy(x).type(torch.FloatTensor)\n",
    "y = torch.from_numpy(y).type(torch.FloatTensor)\n",
    "x.type() # torch推荐使用.type()方法，type(x)这样用会直接输出tensor而不是FloatTensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据切分\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_x,test_x,train_y,test_y = train_test_split(x,y,test_size = 0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构造neural network\n",
    "from torch import nn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = nn.Sequential(\n",
    "        nn.Linear(13,20),\n",
    "        nn.ReLU(), # 大写注意\n",
    "        nn.Linear(20,1)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 优化器和损失函数\n",
    "criterion = nn.MSELoss()\n",
    "optimizer = torch.optim.Adam(model.parameters(),lr=0.01) # 0.001和0.01常用,model.parameters()注意括号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Program Files\\Anaconda3\\envs\\Pytorch\\lib\\site-packages\\torch\\nn\\modules\\loss.py:432: UserWarning: Using a target size (torch.Size([404])) that is different to the input size (torch.Size([404, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n",
      "  return F.mse_loss(input, target, reduction=self.reduction)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 609.9312133789062\n",
      "1 605.514892578125\n",
      "2 601.290283203125\n",
      "3 597.1929931640625\n",
      "4 593.0210571289062\n",
      "5 588.6134643554688\n",
      "6 583.9528198242188\n",
      "7 579.01904296875\n",
      "8 573.7501220703125\n",
      "9 568.0833740234375\n",
      "10 561.983154296875\n",
      "11 555.43115234375\n",
      "12 548.419677734375\n",
      "13 540.944580078125\n",
      "14 533.0045166015625\n",
      "15 524.6001586914062\n",
      "16 515.7337646484375\n",
      "17 506.4100646972656\n",
      "18 496.6357116699219\n",
      "19 486.4201965332031\n",
      "20 475.7751770019531\n",
      "21 464.7149353027344\n",
      "22 453.2569885253906\n",
      "23 441.42132568359375\n",
      "24 429.2308044433594\n",
      "25 416.7118835449219\n",
      "26 403.8935546875\n",
      "27 390.80828857421875\n",
      "28 377.4916076660156\n",
      "29 363.9820251464844\n",
      "30 350.32135009765625\n",
      "31 336.5543518066406\n",
      "32 322.7284240722656\n",
      "33 308.8939514160156\n",
      "34 295.1036071777344\n",
      "35 281.4122619628906\n",
      "36 267.8765869140625\n",
      "37 254.55474853515625\n",
      "38 241.5059051513672\n",
      "39 228.78955078125\n",
      "40 216.46490478515625\n",
      "41 204.5902557373047\n",
      "42 193.22215270996094\n",
      "43 182.4144287109375\n",
      "44 172.21734619140625\n",
      "45 162.6763916015625\n",
      "46 153.8314208984375\n",
      "47 145.71539306640625\n",
      "48 138.35330200195312\n",
      "49 131.76116943359375\n",
      "50 125.94501495361328\n",
      "51 120.90027618408203\n",
      "52 116.61092376708984\n",
      "53 113.04961395263672\n",
      "54 110.17758178710938\n",
      "55 107.94538879394531\n",
      "56 106.29381561279297\n",
      "57 105.15567016601562\n",
      "58 104.45760345458984\n",
      "59 104.12236785888672\n",
      "60 104.07180786132812\n",
      "61 104.22917938232422\n",
      "62 104.52201080322266\n",
      "63 104.884521484375\n",
      "64 105.25926208496094\n",
      "65 105.59888458251953\n",
      "66 105.8666763305664\n",
      "67 106.03683471679688\n",
      "68 106.09402465820312\n",
      "69 106.03240203857422\n",
      "70 105.85427856445312\n",
      "71 105.56873321533203\n",
      "72 105.18972778320312\n",
      "73 104.73455810546875\n",
      "74 104.22220611572266\n",
      "75 103.67210388183594\n",
      "76 103.10282135009766\n",
      "77 102.53126525878906\n",
      "78 101.9720230102539\n",
      "79 101.43706512451172\n",
      "80 100.9354019165039\n",
      "81 100.47323608398438\n",
      "82 100.0541763305664\n",
      "83 99.67938232421875\n",
      "84 99.34798431396484\n",
      "85 99.05757141113281\n",
      "86 98.80438995361328\n",
      "87 98.58391571044922\n",
      "88 98.3911361694336\n",
      "89 98.22090911865234\n",
      "90 98.0681381225586\n",
      "91 97.9281005859375\n",
      "92 97.79657745361328\n",
      "93 97.66984558105469\n",
      "94 97.54493713378906\n",
      "95 97.41954803466797\n",
      "96 97.2919692993164\n",
      "97 97.1611328125\n",
      "98 97.02651977539062\n",
      "99 96.88809967041016\n",
      "100 96.7461929321289\n",
      "101 96.60144805908203\n",
      "102 96.4547119140625\n",
      "103 96.30691528320312\n",
      "104 96.1590805053711\n",
      "105 96.0121841430664\n",
      "106 95.86715698242188\n",
      "107 95.72480773925781\n",
      "108 95.58580017089844\n",
      "109 95.45067596435547\n",
      "110 95.31978607177734\n",
      "111 95.1933364868164\n",
      "112 95.07135009765625\n",
      "113 94.95382690429688\n",
      "114 94.84056854248047\n",
      "115 94.73133850097656\n",
      "116 94.62577819824219\n",
      "117 94.52361297607422\n",
      "118 94.42444610595703\n",
      "119 94.3279800415039\n",
      "120 94.23385620117188\n",
      "121 94.14181518554688\n",
      "122 94.05160522460938\n",
      "123 93.96305847167969\n",
      "124 93.87598419189453\n",
      "125 93.79034423828125\n",
      "126 93.70603942871094\n",
      "127 93.62305450439453\n",
      "128 93.54146575927734\n",
      "129 93.46119689941406\n",
      "130 93.38236236572266\n",
      "131 93.30499267578125\n",
      "132 93.22914123535156\n",
      "133 93.15485382080078\n",
      "134 93.08214569091797\n",
      "135 93.01109313964844\n",
      "136 92.941650390625\n",
      "137 92.87388610839844\n",
      "138 92.80769348144531\n",
      "139 92.74312591552734\n",
      "140 92.68014526367188\n",
      "141 92.61866760253906\n",
      "142 92.55868530273438\n",
      "143 92.50013732910156\n",
      "144 92.44294738769531\n",
      "145 92.38709259033203\n",
      "146 92.33251953125\n",
      "147 92.27919006347656\n",
      "148 92.22703552246094\n",
      "149 92.17606353759766\n",
      "150 92.1261978149414\n",
      "151 92.07743072509766\n",
      "152 92.02972412109375\n",
      "153 91.98307800292969\n",
      "154 91.93744659423828\n",
      "155 91.89280700683594\n",
      "156 91.84916687011719\n",
      "157 91.8065414428711\n",
      "158 91.76481628417969\n",
      "159 91.72404479980469\n",
      "160 91.68421936035156\n",
      "161 91.64527130126953\n",
      "162 91.60723114013672\n",
      "163 91.5700454711914\n",
      "164 91.53370666503906\n",
      "165 91.49818420410156\n",
      "166 91.46347045898438\n",
      "167 91.4295425415039\n",
      "168 91.3963851928711\n",
      "169 91.36393737792969\n",
      "170 91.33222961425781\n",
      "171 91.30120849609375\n",
      "172 91.27088165283203\n",
      "173 91.24120330810547\n",
      "174 91.21216583251953\n",
      "175 91.18375396728516\n",
      "176 91.15593719482422\n",
      "177 91.12873840332031\n",
      "178 91.10210418701172\n",
      "179 91.07600402832031\n",
      "180 91.05047607421875\n",
      "181 91.02547454833984\n",
      "182 91.0009765625\n",
      "183 90.97701263427734\n",
      "184 90.95350646972656\n",
      "185 90.93048858642578\n",
      "186 90.90794372558594\n",
      "187 90.88584899902344\n",
      "188 90.86418914794922\n",
      "189 90.84295654296875\n",
      "190 90.82213592529297\n",
      "191 90.80171966552734\n",
      "192 90.78170013427734\n",
      "193 90.76205444335938\n",
      "194 90.74278259277344\n",
      "195 90.7238540649414\n",
      "196 90.7052993774414\n",
      "197 90.68706512451172\n",
      "198 90.6691665649414\n",
      "199 90.65159606933594\n",
      "200 90.63431549072266\n",
      "201 90.61734771728516\n",
      "202 90.60067749023438\n",
      "203 90.58429718017578\n",
      "204 90.56818389892578\n",
      "205 90.5523452758789\n",
      "206 90.53675842285156\n",
      "207 90.52142333984375\n",
      "208 90.50636291503906\n",
      "209 90.49153137207031\n",
      "210 90.4769287109375\n",
      "211 90.46256256103516\n",
      "212 90.44840240478516\n",
      "213 90.43445587158203\n",
      "214 90.42074584960938\n",
      "215 90.40721130371094\n",
      "216 90.3938980102539\n",
      "217 90.38076782226562\n",
      "218 90.36781311035156\n",
      "219 90.35506439208984\n",
      "220 90.34247589111328\n",
      "221 90.33007049560547\n",
      "222 90.3178482055664\n",
      "223 90.30577087402344\n",
      "224 90.2938461303711\n",
      "225 90.2821044921875\n",
      "226 90.27050018310547\n",
      "227 90.25904846191406\n",
      "228 90.24774169921875\n",
      "229 90.236572265625\n",
      "230 90.22554016113281\n",
      "231 90.21466064453125\n",
      "232 90.20390319824219\n",
      "233 90.19326782226562\n",
      "234 90.18275451660156\n",
      "235 90.17237091064453\n",
      "236 90.162109375\n",
      "237 90.15198516845703\n",
      "238 90.1419448852539\n",
      "239 90.13201904296875\n",
      "240 90.12223052978516\n",
      "241 90.11253356933594\n",
      "242 90.1029281616211\n",
      "243 90.09344482421875\n",
      "244 90.08406829833984\n",
      "245 90.07477569580078\n",
      "246 90.06558990478516\n",
      "247 90.05648040771484\n",
      "248 90.0474853515625\n",
      "249 90.03857421875\n",
      "250 90.02975463867188\n",
      "251 90.02103424072266\n",
      "252 90.01239013671875\n",
      "253 90.00382232666016\n",
      "254 89.99535369873047\n",
      "255 89.98695373535156\n",
      "256 89.97864532470703\n",
      "257 89.97040557861328\n",
      "258 89.9622573852539\n",
      "259 89.95418548583984\n",
      "260 89.94618225097656\n",
      "261 89.93824005126953\n",
      "262 89.93038940429688\n",
      "263 89.92261505126953\n",
      "264 89.91490173339844\n",
      "265 89.90726470947266\n",
      "266 89.89968872070312\n",
      "267 89.8921890258789\n",
      "268 89.8847427368164\n",
      "269 89.87736511230469\n",
      "270 89.87007141113281\n",
      "271 89.86282348632812\n",
      "272 89.85563659667969\n",
      "273 89.84849548339844\n",
      "274 89.84146118164062\n",
      "275 89.83445739746094\n",
      "276 89.82750701904297\n",
      "277 89.82063293457031\n",
      "278 89.8138198852539\n",
      "279 89.80704498291016\n",
      "280 89.80033111572266\n",
      "281 89.7936782836914\n",
      "282 89.78707885742188\n",
      "283 89.78053283691406\n",
      "284 89.77405548095703\n",
      "285 89.76759338378906\n",
      "286 89.76121520996094\n",
      "287 89.75487518310547\n",
      "288 89.74858093261719\n",
      "289 89.74235534667969\n",
      "290 89.73616790771484\n",
      "291 89.73003387451172\n",
      "292 89.72394561767578\n",
      "293 89.7178955078125\n",
      "294 89.7118911743164\n",
      "295 89.70596313476562\n",
      "296 89.7000503540039\n",
      "297 89.69419860839844\n",
      "298 89.68838500976562\n",
      "299 89.6826171875\n"
     ]
    }
   ],
   "source": [
    "# 训练\n",
    "epoch = 300\n",
    "iter_loss = []\n",
    "for i in range(epoch):\n",
    "    # 前向传播\n",
    "    y_pred = model(train_x)\n",
    "    # 计算loss\n",
    "    loss = criterion(y_pred, train_y)\n",
    "    print(i,loss.item())\n",
    "    iter_loss.append(loss.item())\n",
    "    # 清空梯度，torch特别的地方\n",
    "    optimizer.zero_grad()\n",
    "    # 反向传播\n",
    "    loss.backward()\n",
    "    # 权重调整\n",
    "    optimizer.step()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[23.426916],\n",
       "       [21.707548],\n",
       "       [18.678255],\n",
       "       [20.546831],\n",
       "       [21.504692],\n",
       "       [22.91509 ],\n",
       "       [25.005516],\n",
       "       [18.825909],\n",
       "       [24.680193],\n",
       "       [19.512232]], dtype=float32)"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 测试\n",
    "output = model(test_x)\n",
    "predict_list = output.detach().numpy() # detach从最近的graph中分离tensor，Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead\n",
    "predict_list[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([19.3000, 30.1000, 22.8000, 14.5000, 36.0000, 37.6000, 18.5000, 15.6000,\n",
       "         8.1000, 35.1000])"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_y[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制不同iteration的loss\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "plot_x = np.arange(epoch)\n",
    "plot_y = np.array(iter_loss)\n",
    "plt.plot(plot_x,plot_y)\n",
    "plt.title('Loss Value in all iterations')\n",
    "plt.xlabel('iteration') #迭代次数\n",
    "plt.ylabel('Mean Loss Value')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 查看真实值与与测试的散点图\n",
    "scatter_x = np.arange(test_x.shape[0])\n",
    "y1 = np.array(predict_list) # 预测值\n",
    "y2 = np.array(test_y) # 真实值\n",
    "line1 = plt.scatter(scatter_x , y1, c = 'red')\n",
    "line2 = plt.scatter(scatter_x , y2 , c = 'blue')\n",
    "plt.legend([line1,line2],['predict','real'])  # 图例\n",
    "plt.title('Prediction VS RealValue')\n",
    "plt.ylabel('Boston House Price')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.8.0 64-bit ('Pytorch': conda)",
   "language": "python",
   "name": "python38064bitpytorchcondac942a691429d4c98a336a9181186ec56"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
